package com.atguigu.juc.date930;

import java.util.concurrent.*;

/**
 * @Author: shenhao
 * @CreatTime: 2024/10/1 13:49
 * @Version: 1.0
 * 线程池
 *  * Arrays
 *  * Collections
 *  * Executors
 *  利用线程池工具类来创建三个线程池,系统的方法,自己工作中不会使用,有大坑
 *  虽然表面上是三种类型的线程池,但是底层就是一种线程池ThreadPoolExecutor
 */
public class MyThreadPoolDemo {
    public static void main(String[] args) {
        // 可以获取当前系统的cpu核心数
        System.out.println(Runtime.getRuntime().availableProcessors());
        //ExecutorService threadPool = Executors.newFixedThreadPool(5);// 固定数量
        //ExecutorService threadPool = Executors.newSingleThreadExecutor();//只有一个线程的线程池
        //ExecutorService threadPool = Executors.newCachedThreadPool();//不固定数量,遇强则强
        // List list = new ArrayList();
        ExecutorService threadPool = new ThreadPoolExecutor(
                Runtime.getRuntime().availableProcessors(),
                Runtime.getRuntime().availableProcessors()*2,
                2l,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy());
        /*AbortPolicy :默认拒绝策略,直接抛出异常, 不能使用
        CallerRunsPolicy: 不会抛弃任务,也不会报异常,
        而是将某些任务回退到调用者,降低新任务的流量
        DiscardPolicy：该策略默默地丢弃无法处理的任务，不予任何处理也不抛出异常。
        DiscardOldestPolicy：抛弃队列中等待最久的任务，然后把当前任务加人队列中
        * */
        // 10个任务顾客请求
        try {
            for (int i = 1; i <= 15; i++) {
                int finalI = i;
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"\t办理业务: 第"+ finalI+"顾客");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();// 线程池最后要停止,否则线程池不结束
        }

    }
}
